package main

import (
	"fmt"
	"time"
)

func NewUser() {
	// 初始化结构体
	u := User{}
	//println(u)  error
	fmt.Printf("%v \n", u)  // { 0}
	fmt.Printf("%+v \n", u) // {Name: Age:0}

	// up 是一个指针
	up := &User{}
	fmt.Printf("up %+v \n", up) // up &{Name: Age:0}
	up2 := new(User)
	println(up2.Name)
	fmt.Printf("up2 %+v \n", up2) // up2 &{Name: Age:0}

	u4 := User{Name: "alen", Age: 18} // 推荐
	fmt.Printf("u4 %+v \n", u4)
	u5 := User{"alex", 89}
	fmt.Printf("u5 %+v \n", u5)

	u4.Name = "Jerry"
	u5.Name = "Chris"

	var up1 *User
	// nil 上访问字段，或者方法
	//println(up1.Name)  // nil pointer deference
	println(up1) // 0x0

}

type User struct {
	Name string
	Age  int
}

func (u User) ChangeName(name string) {
	fmt.Printf("change name  中 u 的地址 %p\n", &u)
	u.Name = name
}

func (u *User) ChangeAge(age int) {
	fmt.Printf("change age  中 u 的地址 %p\n", u)
	u.Age = age
}

func ChangeUser() {
	u1 := User{Name: "Tom", Age: 1231231}
	fmt.Printf("u1 的地址 %p \n", &u1)
	// 这一步执行的时候，其实相当于复制了一个u1,改的是复制体
	// 所以 u1 原封不动
	u1.ChangeName("alen")
	// (&u).ChangeAge(180)
	u1.ChangeAge(180)
	fmt.Printf("u1 %+v \n \b", u1)

	up1 := &User{}
	// (*up1).ChangeName("Jerry")
	up1.ChangeName("Jerry")
	up1.ChangeAge(10)
	fmt.Printf("up1 %+v \n \b", up1)
}

type Integer int

func UserInt() {
	i1 := 10
	i2 := Integer(i1)
	var i3 Integer = 11
	println(i2, i3)
}

type Fish struct {
}

func (f Fish) Swim() {
	println("fish 在游泳!")
}

type FakeFish Fish

func UseFish() {
	//f := Fish{}
	//f2 := FakeFish(f)
	//f2.Swim()
}

type MyTime time.Time

func (m MyTime) MyFunc() {

}
